\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{nwafu}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%设置常量
\newcommand{\@nwafu}{西北农林科技大学}
\newcommand{\@titlename}{\@theyear{}西北农林科技大学数学建模竞赛}
\newcommand{\nwafu@data}{日期}
\newcommand{\nwafu@year}{年}
\newcommand{\nwafu@month}{月}
\newcommand{\nwafu@day}{日}
\newcommand{\@keywordsname}{\textbf{关键字}}
\newcommand{\@titlea}{\@theyear{}西北农林科技大学数学建模竞赛}
\newcommand{\@titleb}{承\hspace{1em}诺\hspace{1em}书}
\newcommand{\@problemnum}{参赛题号（从A/B中选择一项填写）：}
\newcommand{\@signupnum}{参赛队号：}
\newcommand{\@contents}{\quotation
	我们仔细阅读了数学建模竞赛的竞赛规则。
	
	我们完全明白，在竞赛开始后参赛队员不能以任何方式（包括电话、电子邮件、网上咨询、QQ群、知乎论坛等）与本队以外的任何人（包括指导教师）研究、讨论与赛题有关的问题。
	我们知道，抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其它公开的资料（包括网上查到的资料），必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
	
	我们郑重承诺，严格遵守竞赛规则，以保证竞赛的公正、公平性。如有违反竞赛规则的行为，我们愿意承担由此引起的一切后果。
	
	我们授权西北农林科技大学数学建模竞赛组委会，可将我们的论文以任何形式进行公开展示（包括进行网上公示，在书籍、期刊和其他媒体进行正式或非正式发表等）。
	学建模竞赛组委会，可将我们的论文以任何形式进行公开展示（包括进行网上公示，在书籍、期刊和其他媒体进行正式或非正式发表等）。
	\endquotation
}
%数学常量定义
\newcommand*{\nwafu@definition}{定义}
\newcommand*{\nwafu@theorem}{定理}
\newcommand*{\nwafu@lemma}{引理}
\newcommand*{\nwafu@corollary}{推论}
\newcommand*{\nwafu@assumption}{假设}
\newcommand*{\nwafu@conjecture}{猜想}
\newcommand*{\nwafu@axiom}{公理}
\newcommand*{\nwafu@principle}{定律}
\newcommand*{\nwafu@problem}{问题}
\newcommand*{\nwafu@example}{例}
\newcommand*{\nwafu@proof}{证明}
\newcommand*{\nwafu@solution}{解}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%检查使用的编译器是否为xetex
\RequirePackage{ifxetex}
\RequireXeTeX
\ifxetex\else
\ClassError{mcmthesis}{You must use the `xelatex' driver\MessageBreak Please choose `xelatex'}{%
	Just choose `xelatex', no `pdflatex' or `latex' and so on.}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%导入A4纸
\LoadClass[a4paper,12pt]{article}
%引入宏包
%引入处理中文的宏包
\RequirePackage{ctex}
% 页面布局
\RequirePackage{geometry}
% 字体设置
\RequirePackage{xeCJK}
% 设置附录
\RequirePackage[titletoc,title]{appendix}
% 首行缩进
\RequirePackage{indentfirst}
% 下划线
\RequirePackage{ulem}
% 尺寸计算
\RequirePackage{calc}
\RequirePackage{etoolbox}
\AtBeginEnvironment{thebibliography}
{
	\phantomsection
	\addcontentsline{toc}{section}{\refname}
}
%引入改标题
\RequirePackage{titlesec}
\RequirePackage{titletoc}
% 数学宏包
\RequirePackage{amsmath}
\RequirePackage{amsfonts}
\RequirePackage{amssymb}
\RequirePackage{bm}

% 设置颜色
\RequirePackage{xcolor}
%固定图或表的位置
\RequirePackage{float}
% 插入图片
\RequirePackage{graphicx}
\RequirePackage{float}
% 表格
\RequirePackage{array}
%% 长表格
\RequirePackage{longtable}
%% booktabs 提供了\toprule 等命令.
\RequirePackage{booktabs,tabularx}
%% multirow 支持在表格中跨行
\RequirePackage{multirow}
%% 调整间隔, 让表格更好看些
\RequirePackage{bigstrut}
%% 在跨行表格中输入定界符
\RequirePackage{bigdelim}
% 保护脆落命令
\RequirePackage{cprotect}
% 设置代码环境
\RequirePackage{listings}
\RequirePackage{xcolor}
% 插入链接
\RequirePackage{url}
% 超链接 hyperref 的设置
\RequirePackage{hyperref}
% 定制列表环境
\RequirePackage{enumitem}
% 字图与子标题
\RequirePackage{subcaption}
\RequirePackage[titles]{tocloft}
\renewcommand{\cftsecdotsep}{4.5}
\setlength{\cftbeforesecskip}{7pt}
\setlength{\cftbeforesubsecskip}{3pt}
\renewcommand{\cftsecfont}{\bfseries\zihao{-4}\heiti}
\renewcommand{\cftsecleader}{\cftdotfill{\cftsecdotsep}}
\renewcommand{\cftsecaftersnumb}{\hskip.4em}
%%设置字体
\setmainfont{Times New Roman}
\setsansfont{Arial}
\setCJKfamilyfont{kai}[AutoFakeBold]{simkai.ttf}
\newcommand*{\kai}{\CJKfamily{kai}}
\setCJKfamilyfont{song}[AutoFakeBold]{SimSun}
\newcommand*{\song}{\CJKfamily{song}}
% 页面布局
\geometry{top=25mm,bottom=25mm,left=25mm,right=25mm}
\renewcommand*{\baselinestretch}{1.38}
%关于数学的常量定义
\newtheorem{definition}{\nwafu@definition}
\newtheorem{theorem}{\nwafu@theorem}
\newtheorem{lemma}{\nwafu@lemma}
\newtheorem{corollary}{\nwafu@corollary}
\newtheorem{assumption}{\nwafu@assumption}
\newtheorem{conjecture}{\nwafu@conjecture}
\newtheorem{axiom}{\nwafu@axiom}
\newtheorem{principle}{\nwafu@principle}
\newtheorem{problem}{\nwafu@problem}
\newtheorem{example}{\nwafu@example}
\newtheorem{proof}{\nwafu@proof}
\newtheorem{solution}{\nwafu@solution}

%设置目录格式
 \titlecontents{section}[0pt]{\vspace{2mm}\bfseries}
 {\thecontentslabel\hskip.5em}{}{\titlerule*[0.5pc]{.}\contentspage}
 \titlecontents{subsection}[30pt]{\songti}
 {\thecontentslabel\hskip.5em}{}{\titlerule*[0.5pc]{.}\contentspage}
 \titlecontents{subsubsection}[55pt]{\songti}
 {\thecontentslabel\hskip.5em}{}{\titlerule*[0.5pc]{.}\contentspage}
% 中文标题格式设置
% 目录深度
\def\@seccntformat#1{\csname the#1\endcsname\ }
\renewcommand\thesection{\chinese{section}、}
\renewcommand\thesubsection{\arabic{section}\thinspace.\thinspace\arabic{subsection}}
\renewcommand\thesubsubsection{\thesubsection\thinspace.\thinspace\arabic{subsubsection}}
\renewcommand\section{\@startsection{section}{1}{\z@}%
	{-3.5ex \@plus -1ex \@minus -.2ex}%
	{2.3ex \@plus.2ex}%
	{\centering\heiti\zihao{4}}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
	{-3.25ex\@plus -1ex \@minus -.2ex}%
	{1.5ex \@plus .2ex}%
	{\heiti\zihao{-4}}}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
	{-3.25ex\@plus -1ex \@minus -.2ex}%
	{1.5ex \@plus .2ex}%
	{\heiti\zihao{-4}}}
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
	{3.25ex \@plus1ex \@minus.2ex}%
	{-1em}%
	{\songti\zihao{-4}}}
\renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%缩进
	{3.25ex \@plus1ex \@minus .2ex}%
	{-1em}
	{\songti\zihao{-4}}}
%设置单倍行距
\linespread{2.0}
% 浮动环境设置
% 默认情况下, \LaTeX{} 要求每页的文字至少占据 20%,否则该页就只单独放置一个浮动环境,
% 而这通常不是我们想要的, 我们将这个要求降低到 5%.
\renewcommand*{\textfraction}{0.05}
% 有时如果多个浮动环境连续放在一起, \LaTeX{}
% 会将它们分在几个不同页，即使它们可在同一页放
% 得下. 我们可以通过修改 |\topfraction| 和 |\bottomfraction| 分别设置顶端和底端的浮
% 动环境的最大比例.
\renewcommand*{\topfraction}{0.9}
\renewcommand*{\bottomfraction}{0.8}
% 有时\LaTeX{}会把一个浮动环境单独放在一页,
% 我们要求这个环境至少要占据 85% 才能单独放在一页.
% 注意:  |\floatpagefraction| 的数值必须小于 |\topfraction|.
\renewcommand*{\floatpagefraction}{0.85}
% 关于图片 graphicx
% 如果图片没有指定后缀, 依次按下列顺序搜索
\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png}
% 设置图表搜索路径, 可以给图表文件夹取如下名字
\graphicspath{{figures/}{figure/}{pictures/}%
	{picture/}{pic/}{pics/}{image/}{images/}}
% 修改tabular 环境, 设置表格中的行间距为正文行间距.
\let\mcm@oldtabular\tabular
\let\mcm@endoldtabular\endtabular
\renewenvironment{tabular}%
{\bgroup%
	\renewcommand{\arraystretch}{1.38}%
	\mcm@oldtabular}%
{\mcm@endoldtabular\egroup}
% 图表标题
\DeclareCaptionFont{song}{\songti}
\DeclareCaptionFont{minusfour}{\zihao{-4}}
\captionsetup[figure]{%
	format=hang,   % 标题从第二行开始都有缩进, 应该和 justification=raggedright 的效果一样.
	labelsep=quad, % 分隔符是一个空格
	font={song,minusfour,bf}, % 图的字体, 宋体小四
	position=bottom % position=bottom, 不代表标题放在下面, 标题仍放在你放\caption的位置.
}
\captionsetup[table]{%
	format=hang,   % 标题从第二行开始都有缩进, 应该和 justification=raggedright 的效果一样.
	labelsep=quad, % 分隔符是一个空格
	font={song,minusfour,bf}, % 表的字体, 宋体小四
	position=top % position=bottom, 不代表标题放在下面, 标题仍放在你放\caption的位置.
}
% 列表环境设置
\setlist{%
	topsep=0.3em, % 列表顶端的垂直空白
	partopsep=0pt, % 列表环境前面紧接着一个空白行时其顶端的额外垂直空白
	itemsep=0ex plus 0.1ex, % 列表项之间的额外垂直空白
	parsep=0pt, % 列表项内的段落之间的垂直空白
	leftmargin=1.5em, % 环境的左边界和列表之间的水平距离
	rightmargin=0em, % 环境的右边界和列表之间的水平距离
	labelsep=0.5em, % 包含标签的盒子与列表项的第一行文本之间的间隔
	labelwidth=2em % 包含标签的盒子的正常宽度；若实际宽度更宽，则使用实际宽度。
}
% 超链接
\hypersetup{%
	%xetex,
	% unicode=false, % hyperref 和 xetex 同时使用时不能开启 Unicode 选项.
	pdfstartview=FitH,
	CJKbookmarks=true,
	bookmarksnumbered=true,
	bookmarksopen=true,
	colorlinks, %注释掉此项则交叉引用为彩色边框(将colorlinks和pdfborder同时注释掉)
	pdfborder=001,   %注释掉此项则交叉引用为彩色边框
	allcolors=black,
	breaklinks=true}
\pdfstringdefDisableCommands{%
	\def\cftdotfill{ }%
}
\lstnewenvironment{tcode}
{
	\lstset{basicstyle = \small\ttfamily,
		language=TeX,
		tabsize = 4,
		frame = single,
		escapechar = `,
		breaklines = true,
		breakatwhitespace = true,
		frameround = tttt,
	}
}
{}
%%%%%%%%%%%%%%%获取年月日等信息
\newcommand{\tihao}[1]{\newcommand{\@tihao}{#1}}
\newcommand{\duihao}[1]{\newcommand{\@duihao}{#1}}
\newcommand{\theyear}[1]{\newcommand{\@theyear}{#1}}
\newcommand{\themonth}[1]{\newcommand{\@themonth}{#1}}
\newcommand{\theday}[1]{\newcommand{\@theday}{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%重新定义一个maketitle在原标题的基础上添加承诺书等
\renewcommand{\maketitle}{\par
	\begingroup
		\newpage
		\global\@topnum\z@
		\@maketitle%自定义标题
	\endgroup
	\global\let\thanks\relax
	\let\maketitle\relax
	\let\@maketitle\relax
	\global\let\@thanks\@empty
	\global\let\@author\@empty
	\global\let\@date\@empty
	\global\let\@title\@empty
	\global\let\title\relax
	\global\let\author\relax
	\global\let\date\relax
	\global\let\and\relax
}
\renewcommand{\@maketitle}
{
	\newpage
	\vskip2ex
	\thispagestyle{empty}%页码为空
	\begin{center}
		{\zihao{-2}\bfseries\heiti \@titlea \par}
		{\vskip1ex\zihao{3}\bfseries\heiti\@titleb \par}
	\end{center}
	{\zihao{-4} \@contents \par}
	{\vskip1ex\zihao{-4}
		\renewcommand{\ULthickness}{0.4pt}\setlength{\ULdepth}{2pt}
		\newlength{\nwafu@lenthA}
		\settowidth{\nwafu@lenthA}{西北农林科技大学}
		\newlength{\nwafu@lenthB}
		\settowidth{\nwafu@lenthB}{西北农林科技大学西北农林科技}
		\hspace*{2em}\@problemnum\uline{\mbox{\kern1em}\hspace{\nwafu@lenthA}\@tihao\hfill}\makebox[0.66em]{}\par
		\@signupnum\uline{\mbox{\kern1em}\hspace{\nwafu@lenthB}\@duihao\hfill}\makebox[0.66em]{}\par
	}
\vspace{15em}
	\newlength{\nwafu@lenthC}
	\settowidth{\nwafu@lenthC}{西北农林科技大学西北农林科技大学西北农林科技大学西北农林}
	\hspace*{\nwafu@lenthC}\nwafu@data\hspace{0.5em}\uline{\hfill\mbox{\kern1em}\@theyear\mbox{\kern1em}\hfill}
	{\nwafu@year\uline{\hfill\@themonth\hfill}\nwafu@month
		\uline{\hfill\@theday\hfill}\nwafu@day\makebox[1em]{}\par}
	\newpage
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%定义摘要
\renewenvironment{abstract}{
	\begin{center}%
		{\zihao{4}\bfseries \abstractname\vspace{-.5em}\vspace{\z@}}%
	\end{center}%
	\quotation
	}
{\endquotation\vfill\null}
\renewenvironment{quotation}
{\list{}{\listparindent 2em%
		\itemindent \listparindent
		\rightmargin\z@
		\leftmargin\z@
		\parsep \z@ \@plus\p@}%
	\item\relax}
{\endlist}
%定义关键字
\newcommand{\keywords}[1]{%
	{\indent\zihao{-4}\heiti\@keywordsname：}~{#1}
	\newpage
}
%定义参考文献
% 上标文献
\newcommand{\upcite}[1]{$^{\mbox{\scriptsize \cite{#1}}}$}
\newcommand{\supercite}[1]{\textsuperscript{\textsuperscript{\cite{#1}}}}
\endinput
\renewenvironment{thebibliography}[1]
{\section*{\refname}%
	\@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}%
	\list{\@biblabel{\@arabic\c@enumiv}}%
	{\settowidth\labelwidth{\@biblabel{#1}}%
		\leftmargin\labelwidth
		\advance\leftmargin\labelsep
		\@openbib@code
		\usecounter{enumiv}%
		\let\p@enumiv\@empty
		\renewcommand\theenumiv{\@arabic\c@enumiv}}%
	\sloppy
	\clubpenalty4000
	\@clubpenalty \clubpenalty
	\widowpenalty4000%
	\sfcode`\.\@m}
{\def\@noitemerr
	{\@latex@warning{Empty `thebibliography' environment}}%
	\endlist}
% 定义附录
 \renewcommand\appendix{\par
	 \setcounter{section}{1}%
	  \setcounter{subsection}{2}%
	 \gdef\thesection{附录\@Alph\c@section}}


